昨天我們說到 Service Container 是一個地方綁定你類別如何產生出來,或者是你想將 interface 綁定某個 class 來作出實例,我們需要一個地方來描述這個實例過程,我們可以打開 config/app.php 這個檔案,裡面有一個 providers 的 Array,裡面存放 laravel 提供的 Service Provider,今天我們也可以自己定義一個 Service Provider。
我們就借用上篇文章定義的 Animal 來試試看。
我們創建一個Service Provider
php artisan make:provider AnimalServiceProvider
好接著打開 AnimalServiceProvider.php 我們要修改 register 這個方法
public function register()
{
$this->app->bind(Animal::class, function () {
return new Dog();
});
}
然後將 AnimalServiceProvider 放到config/app.php 的 providers 裏
App\Providers\AnimalServiceProvider::class,
接著試著使用它,創建一個 command 來試試
php artisan make:command Animals
修改 $signature 為 animal,並改寫handle
public function handle(Animal $animal)
{
dd($animal->say());
return 0;
}
印出來會看到,汪汪,若要改成用Cat實作呢,我們可以改一下 Service Provider 的 register 試試看
public function register()
{
$this->app->bind(Animal::class, function () {
return new Cat();
});
}
再次執行後會是 喵~
也可以使用 singleton 來綁定
public function register()
{
$this->app->singleton(Animal::class, function () {
return new Cat();
});
}
若你希望你的 Provider 不要一開始就註冊到Container,想等到需要用實在註冊的話,可以實作 DeferrableProvider,這樣他在需要時,才會進行註冊
<?php
namespace App\Providers;
use App\Animal\Cat;
use App\Animal\Animal;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Support\DeferrableProvider;
class AnimalServiceProvider extends ServiceProvider implements DeferrableProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(Animal::class, function () {
return new Cat();
});
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
OK~今天就研究到這邊,明天再來看生命週期。